package 状态机.请假demo.machine;


import com.google.common.eventbus.AllowConcurrentEvents;
import com.google.common.eventbus.Subscribe;
import 状态机.请假demo.entity.LeavePermit;
import 状态机.请假demo.handler.IStatusHandler;
import 状态机.请假demo.handler.StatusHandlerRegistry;

/**
 * 寻找假单的处理接口 IStatusHandler
 * IStatusHandler的实现类CommonStatusHandler会执行统一的审批、状态转移流程
 * <p>
 * <p>
 * 监听 EventBus 的状态更改事件，
 * 并从 StatusHandlerRegistry 里面获取状态改变后的处理者，并执行其 handler 方法
 */
public class NotifySpecificLeavePermitHandler {

    //处理假单 注解代表可以接受到StatusMachineEngine发布的假单
    @Subscribe
    @AllowConcurrentEvents
    public void handle(LeavePermit leavePermit) {
        // 获取到 StatusHandler 后，执行其 handler 方法
        // 该 handler 方法先执行具体处理者的 doHandler 方法，然后执行 获取假单下一个状态 的方法
        // 这样状态就自动转移了
        getStatusHandler(leavePermit).handler(leavePermit);
    }

    /**
     * 获取 假单 当前状态 的具体处理者（例如是 CEO? 还是 HR?）
     *
     * @param leavePermit
     * @return StatusHandler
     */
    public static IStatusHandler getStatusHandler(LeavePermit leavePermit) {
        return StatusHandlerRegistry.acquireStatusHandler(leavePermit.getLeavePermitType(), leavePermit.getStatus());
    }

}
